package main

import (
	"encoding/json"
	"fmt"
)

/*
	key - value 的键值存储
	用hash表存
	跟python的字典类似
	key -- 天生去重
			可hash的
	key -- 值类型
	布尔类型、整型、浮点数、字符串、数组	都可以作为key
	切片等引用类型不能作为key

	map -- 引用类型

	var name map[key type] value_type

	var m1 map[string]

	使用make函数去申明
	name := make(map[key_type]value_type)
 */
func main() {
	//申请内存空间
	//CountryMap := make(map[string]string)
	////赋值
	//CountryMap["china"] = "中国"
	//CountryMap["usa"] = "美国"
	//CountryMap["japan"] = "日本"
	//fmt.Println(CountryMap)

	//返回的第一个值是Japan这个key所对应的value
	//返回的第二个值是状态信息，如果正常取到值，就没有错误，那ok为true
	//						不能正常取到值，就发生错误，ok不为false
	//_, ok := CountryMap["japan"]
	//if ok{
	//	fmt.Println("取到值")
	//}else{
	//	fmt.Println("取不到值")
	//}

	//声明 赋值
	CountryMap := map[string]string{
		"china": "中国",
		"usa" : "美国",
		"japan" : "日本",
	}
	CountryMap["India"] = "印度"
	//遍历
	for i,v := range CountryMap {
		fmt.Println(i,"is:",v)
	}

	//删除
	delete(CountryMap,"japan")
	fmt.Println(CountryMap)

	NameInfo := map[string]map[string]int {
		"root":{"age":18},
		"admin":{"age":19},
	}
	fmt.Println(NameInfo["root"]["age"])

	//json和map的转换
	//map ->json
	//err 错误信息	如果err不为空，表示发生异常，转换出错
	//				如果err为空，表示转换正常
	//返回的value是byte类型的数组
	//marshal, err := json.Marshal(NameInfo)
	//if err != nil {
	//	fmt.Println("转换出错")
	//}else {
	//	fmt.Println("map成功转换：",marshal)
	//	fmt.Println("转换成字符串",string(marshal))
	//}

	//json -> map
	datastr := `{"a":1, "b":2}` //字符串反引号是原样输出
	var dataMap map[string]int
	err := json.Unmarshal([]byte(datastr),&dataMap)
	if err != nil {
		fmt.Println("出错")
	}else {
		fmt.Printf("转换好的map对象为：%v,类型为%T",dataMap,dataMap)
	}


}